package org.budo.mybatis.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.budo.support.dao.page.Page;

import lombok.Getter;
import lombok.Setter;

/**
 * @author limingwei
 */
public interface MybatisDao {
    public Boolean save(Class<?> entityType, Object entity);

    /**
     * insert,略去空值属性
     */
    public Boolean saveIgnoreNull(Class<?> entityType, Object entity);

    /**
     * 批量insert
     */
    Boolean saveBatch(Class<?> entityType, List<?> list);

    /**
     * 批量insert, 指定单次语句插入条数，超出则拆分后循环执行
     */
    Boolean saveBatch(Class<?> entityType, List<?> list, Integer batchSize);

    /**
     * @return 返回自增主键
     */
    Serializable insert(Class<?> entityType, Object entity);

    /**
     * @return 返回自增主键
     */
    Serializable insertIgnoreNull(Class<?> entityType, Object entity);

    /**
     * @return 返回自增主键
     */
    Serializable[] insertBatch(Class<?> entityType, List<?> list);

    <T> T findById(Class<T> entityType, Serializable id);

    <T> T findBySql(Class<T> entityType, String sql, Map<String, Object> parameter);

    /**
     * @param resultMap org.budo.mybatis.dao.MybatisDao.ResultMap.byId("id in xml")
     */
    <T> T findBySql(ResultMap resultMap, String sql, Map<String, Object> parameter);

    <T> T findByColumns(Class<T> entityType, Map<String, Object> columnsAndValues);

    <T> T findByExample(Class<T> entityType, Object entity);

    Boolean deleteById(Class<?> entityType, Serializable id);

    Integer deleteByIds(Class<?> entityType, Serializable[] ids);

    Integer deleteBySql(String sql, Map<String, Object> parameter);

    <T> List<T> list(Class<T> entityType, Page page);

    <T> List<T> listByIds(Class<T> entityType, Serializable[] ids);

    <T> List<T> listByColumns(Class<T> entityType, Map<String, Object> columnsAndValues, Page page);

    <T> List<T> listBySql(Class<T> entityType, String sql, Map<String, Object> parameter, Page page);

    /**
     * @param resultMap org.budo.mybatis.dao.MybatisDao.ResultMap.byId("id in xml")
     */
    List listBySql(ResultMap resultMap, String sql, Map<String, Object> parameter, Page page);

    Boolean update(Class<?> entityType, Object entity);

    Boolean updateIgnoreNull(Class<?> entityType, Object entity);

    Integer updateBySql(String sql, Map<String, Object> parameter);

    Integer updateColumns(Class<?> entityType, Serializable[] ids, Map<String, Object> columnsAndValues);

    /**
     * sqlSession.selectList(statementId, parameter);
     */
    <T> List<T> listByStatement(String statementId, Map<String, Object> parameter, Page page);

    SqlSession getSqlSession();

    void assertResultMap(Class<?> entityType);

    /**
     * 仅封装了一个 ResultMap.id
     */
    @Getter
    @Setter
    public class ResultMap {
        private String id;

        public static ResultMap byId(String id) {
            ResultMap resultMap = new ResultMap();
            resultMap.setId(id);
            return resultMap;
        }
    }
}